package com.dss.auto_deploy.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dss.auto_deploy.domain.AdmDockerRegistry;
import com.dss.auto_deploy.domain.AdmNamespace;
import com.dss.auto_deploy.dto.AdmNamespaceAddDto;
import com.dss.auto_deploy.dto.AdmNamespacePageDto;
import com.dss.auto_deploy.dto.AdmNamespaceUpdateDto;
import com.dss.auto_deploy.mapper.AdmDockerRegistryMapper;
import com.dss.auto_deploy.mapper.AdmNamespaceMapper;
import com.dss.auto_deploy.service.IAdmNamespaceService;
import com.dss.auto_deploy.util.BeanUtils;
import com.dss.auto_deploy.util.CacheUtils;
import com.dss.auto_deploy.util.JacksonUtils;
import com.dss.auto_deploy.util.StringUtils;
import com.dss.auto_deploy.vo.AdmNamespaceVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author dongshoushan
 * @Description:环境命名空间Service实现类
 * @date 2022-09-27 13:47:24
 */
@Service
@Slf4j
@RequiredArgsConstructor(onConstructor = @_(@Autowired))
public class AdmNamespaceServiceImpl extends ServiceImpl<AdmNamespaceMapper, AdmNamespace> implements IAdmNamespaceService {

    /**
     * 环境命名空间Mapper
     */
    private final AdmNamespaceMapper admNamespaceMapper;
    private final CacheUtils cacheUtils;
    private final AdmDockerRegistryMapper admDockerRegistryMapper;

    /**
     * 新增环境命名空间
     *
     * @param admNamespaceAddDto
     * @return Long
     */
    @Override
    public int insert(AdmNamespaceAddDto admNamespaceAddDto) {
        AdmNamespace admNamespace = BeanUtils.copy(admNamespaceAddDto, AdmNamespace.class);
        admNamespace.setCreateTime(new Date());
        admNamespace.setUpdateTime(new Date());
        int insert = admNamespaceMapper.insert(admNamespace);
        if (insert == 1) {
            log.info("新增成功{}", JacksonUtils.toString(admNamespace));
        }
        cacheUtils.deleteObject("getAllAdmNamespace");
        return insert;
    }


    /**
     * 修改环境命名空间
     *
     * @param admNamespaceUpdateDto
     * @return Long
     */
    @Override
    public int update(AdmNamespaceUpdateDto admNamespaceUpdateDto) {
        AdmNamespace admNamespace = BeanUtils.copy(admNamespaceUpdateDto, AdmNamespace.class);
        int number = admNamespaceMapper.updateById(admNamespace);
        if (number == 1) {
            log.info("修改成功{}", JacksonUtils.toString(admNamespace));
        }
        cacheUtils.deleteObject("getAllAdmNamespace");
        return number;
    }


    /**
     * 批量删除环境命名空间
     *
     * @param ids
     * @return Long
     */
    @Override
    public void deleteBatch(Long[] ids) {
        this.removeByIds(Arrays.asList(ids));
        cacheUtils.deleteObject("getAllAdmNamespace");
    }

    /**
     * 环境命名空间分页查询
     *
     * @param pageDto
     * @return List<AdmNamespace>
     */
    @Override
    public Page<AdmNamespaceVo> list(AdmNamespacePageDto pageDto) {
        Page<AdmNamespace> tablesPage = new Page<>(pageDto.getPage(), pageDto.getLimit());
        QueryWrapper<AdmNamespace> queryWrapper = Wrappers.query();
        if (StringUtils.isNotEmpty(pageDto.getContent())) {
            queryWrapper.like("name", pageDto.getContent());
        }
        queryWrapper.orderByAsc("sort");
        Page<AdmNamespace> pageSelectResult = admNamespaceMapper.selectPage(tablesPage, queryWrapper);
        List<AdmNamespace> records = pageSelectResult.getRecords();
        List<AdmNamespaceVo> voList = convert(records);
        Page<AdmNamespaceVo> page = new Page<>();
        page.setRecords(voList);
        page.setTotal(pageSelectResult.getTotal());
        page.setSize(pageSelectResult.getSize());
        return page;
    }

    public List<AdmNamespaceVo> convert(List<AdmNamespace> list) {
        if (list.isEmpty()){
            return new ArrayList<>();
        }
        List<AdmNamespaceVo> voList = BeanUtils.copyList(list, AdmNamespaceVo.class);
        List<Long> registryIds = list.stream().map(AdmNamespace::getRegistryId).collect(Collectors.toList());
        List<AdmDockerRegistry> dockerRegistryList = admDockerRegistryMapper.selectBatchIds(registryIds);
        voList.forEach(vo -> {
            AdmDockerRegistry admDockerRegistry = dockerRegistryList.stream().filter(s -> s.getId().equals(vo.getRegistryId())).findFirst().orElse(null);
            if (admDockerRegistry != null){
                vo.setRegistryName(admDockerRegistry.getRegistryName());
            }
        });
        return voList;
    }

    @Override
    public List<AdmNamespace> getAll(String name) {
        QueryWrapper<AdmNamespace> queryWrapper = Wrappers.query();
        if (StringUtils.isNotEmpty(name)) {
            queryWrapper.like("name", name);
        }
        queryWrapper.orderByAsc("sort");
        return admNamespaceMapper.selectList(queryWrapper);
    }

    @Override
    public List<AdmNamespace> getAll() {
        if (cacheUtils.hasKey("getAllAdmNamespace")) {
            return cacheUtils.getCacheObject("getAllAdmNamespace");
        }else {
            List<AdmNamespace> list = admNamespaceMapper.selectList(null);
            cacheUtils.setCacheObject("getAllAdmNamespace", list,60*60*1000*24);
            return list;
        }
    }
}
